//#include <stdio.h>
//#include <stdlib.h>
//
//#define MOD 998244353
//
//int main() 
//{
//    int n, m;
//    scanf_s("%d %d", &n, &m);
//    int st[10], ed[10];
//    for (int i = 0; i < m; i++)
//    {
//        scanf_s("%d %d", &st[i], &ed[i]);
//    }
//
//    int popcount_table[1024];
//    for (int i = 0; i < 1024; i++)
//    {
//        int cnt = 0;
//        int t = i;
//        while (t)
//        {
//            cnt++;
//            t &= t - 1;
//        }
//        popcount_table[i] = cnt;
//    }
//
//    int* cover = (int*)calloc(n + 1, sizeof(int));
//    for (int i = 0; i < m; i++)
//    {
//        for (int j = st[i]; j <= ed[i]; j++) 
//        {
//            cover[j] |= (1 << i);
//        }
//    }
//
//    int total_schemes = 1 << m;
//    int total = 0;
//    for (int s = 0; s < total_schemes; s++) 
//    {
//        int valid = 1;
//        for (int i = 1; i <= n; i++)
//        {
//            int x = s & cover[i];
//            if (popcount_table[x] < 2) 
//            {
//                valid = 0;
//                break;
//            }
//        }
//        if (valid)
//        {
//            total = (total + 1) % MOD;
//        }
//    }
//
//    printf("%d\n", total);
//    free(cover);
//    return 0;
//}

#include <stdio.h>
#include <stdlib.h>

#define MAX_N 1000
#define MAX_M 1000

typedef struct 
{
    int x, y;
} Point;

Point queue[MAX_N * MAX_M];
int front, rear;

void initQueue()
{
    front = rear = 0;
}

void enqueue(int x, int y)
{
    queue[rear].x = x;
    queue[rear].y = y;
    rear++;
}

Point dequeue()
{
    return queue[front++];
}

int isEmpty() 
{
    return front == rear;
}


int main() 
{
    int n, m;
    int xs, ys, xt, yt;
    char grid[MAX_N][MAX_M + 1];
    int dist[MAX_N][MAX_M];

    scanf_s("%d %d", &n, &m);
    scanf_s("%d %d %d %d", &xs, &ys, &xt, &yt);
    xs--; ys--; xt--; yt--;

    for (int i = 0; i < n; i++) 
    {
        scanf_s("%s", grid[i]);
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++) 
        {
            dist[i][j] = -1;
        }
    }

    initQueue();
    enqueue(xs, ys);
    dist[xs][ys] = 0;

    int dx[] = { -1, 1, 0, 0 };
    int dy[] = { 0, 0, -1, 1 };

    while (!isEmpty())
    {
        Point p = dequeue();
        int x = p.x;
        int y = p.y;

        if (x == xt && y == yt)
        {
            break;
        }

        for (int i = 0; i < 4; i++) 
        {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if (nx >= 0 && nx < n && ny >= 0 && ny < m) 
            {
                if (grid[nx][ny] == '.' && dist[nx][ny] == -1) 
                {
                    dist[nx][ny] = dist[x][y] + 1;
                    enqueue(nx, ny);
                }
            }
        }
    }

    printf("%d\n", dist[xt][yt]);

    return 0;
}